package org.zhadoop.stream.cql.semanticanalyzer;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zhadoop.stream.api.streams.Schema;
import org.zhadoop.stream.cql.exception.SemanticAnalyzerException;
import org.zhadoop.stream.cql.semanticanalyzer.parser.context.ParseContext;
import org.zhadoop.streaming.exception.ErrorCode;

/**
 * 语义分析工厂方法
 * <p/>
 * 为什么不愿意放在parseContext 接口中定义呢，是为了保持业务的隔离
 * 两个接口做的不一样的事情，语法分析分析接口中突然冒出一个创建语义分析实例的接口，
 * 两个有没有多大的关联，不应该耦合在一起
 * 放这里的不好就是当有新的语法添加的时候，这个类也要修改，如果不修改，编译也不会出错，所以很容易忘记
 * @author zwd
 *
 */
public class SemanticAnalyzerFactory {
	private static final Logger LOG = LoggerFactory.getLogger(SemanticAnalyzerFactory.class);
	
	public static SemanticAnalyzer createAnalyzer(ParseContext parseContext,List<Schema> schemas) 
			throws SemanticAnalyzerException{
		SemanticAnalyzer analyzer = parseContext.createAnalyzer();
		checkAnalyzerNull(parseContext, analyzer);
		analyzer.init(schemas);
		return analyzer;
	}

	private static void checkAnalyzerNull(ParseContext parseContext, SemanticAnalyzer analyzer) 
	throws SemanticAnalyzerException{
		if(analyzer == null){
			LOG.error("Can not find analyzer for parse context '{}'.",parseContext.getClass().getName());
			SemanticAnalyzerException exception = new SemanticAnalyzerException(ErrorCode.UNKNOWN_SERVER_COMMON_ERROR);
			throw exception;
		}
		
	}
}
